#ifndef ROGUE_ASSISTANT_H
#define ROGUE_ASSISTANT_H

enum ASSISTANT_STATE_NUM
{
    ASSISTANT_STATE_NONE,
    ASSISTANT_STATE_TITLE_SCREEN,
    ASSISTANT_STATE_OVERWORLD,
    ASSISTANT_STATE_BATTLE,
};

enum ASSISTANT_SUBSTATE_NUM
{
    ASSISTANT_SUBSTATE_NONE,
    ASSISTANT_SUBSTATE_TITLE_SCREEN_INTRO,
    ASSISTANT_SUBSTATE_TITLE_SCREEN_PRESS_START,
    ASSISTANT_SUBSTATE_TITLE_SCREEN_MAIN_MENU,
    ASSISTANT_SUBSTATE_OVERWORLD_MOVEMENT,
    ASSISTANT_SUBSTATE_OVERWORLD_LOCKED,
    ASSISTANT_SUBSTATE_BATTLE_INIT,
    ASSISTANT_SUBSTATE_BATTLE_CHOOSE_ACTION,
    ASSISTANT_SUBSTATE_BATTLE_CHOOSE_MOVE,
    ASSISTANT_SUBSTATE_BATTLE_CHOOSE_ITEM,
    ASSISTANT_SUBSTATE_BATTLE_CHOOSE_POKEMON,
    ASSISTANT_SUBSTATE_BATTLE_TURN_ACTIONS,
    ASSISTANT_SUBSTATE_BATTLE_END,
};

enum REQUEST_STATE_NUM
{
    REQUEST_STATE_NONE,
    REQUEST_STATE_MULTIPLAYER_HOST,
    REQUEST_STATE_MULTIPLAYER_JOIN,
};

#define PUSH_ASSISTANT_STATE(state) Rogue_UpdateAssistantState(ASSISTANT_STATE_ ## state, ASSISTANT_SUBSTATE_NONE)
#define PUSH_ASSISTANT_STATE2(state, substate) Rogue_UpdateAssistantState(ASSISTANT_STATE_ ## state, ASSISTANT_SUBSTATE_ ## state ## _ ## substate)

void Rogue_AssistantInit();

bool8 Rogue_IsAssistantConnected();

void Rogue_UpdateAssistantState(u16 state, u16 substate);
void Rogue_UpdateAssistantRequestState(u16 state);

void Rogue_AssistantMainCB();
void Rogue_AssistantOverworldCB();

void RogueBox_OpenConnection();
void RogueBox_CloseConnection();
bool32 RogueBox_IsConnectedAndReady();
u8 RogueBox_GetCountInBox(u8 i);
u8 const* RogueBox_GetName(u8 i);
bool32 RogueBox_IsLocalBox(u8 i);
void RogueBox_SwapBoxes(u8 a, u8 b);

#endif